/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import dao.exception.DAOCandidatException;
import dao.interfaces.DAOCandidat;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import model.Candidat;

/**
 *
 * @author Paul
 */
public class DAOCandidatImpl implements DAOCandidat {

    private DAOInit daoConnection;

    public DAOCandidatImpl(DAOInit daoConnection) {
        this.daoConnection = daoConnection;
    }

    @Override
    public ArrayList<Candidat> findAll() throws DAOCandidatException {
        String query = "SELECT c.idCandidat, u.idUtilisateur, u.nom, u.prenom, c.diplomes, c.competences, "
                + "c.situationPro, c.motivation, u.telephone, u.email, u.adresse, u.typeUtilisateur "
                + "FROM utilisateur u,candidat c where "
                + "u.typeUtilisateur = 'candidat' and u.idUtilisateur=c.idUtilisateur";
        ArrayList<Candidat> candidats = new ArrayList<Candidat>();
        try {
            Connection conn = daoConnection.getConnection();//Creation de la connexion
            Statement stmt = conn.createStatement();
            ResultSet res = stmt.executeQuery(query);
            while (res.next()) {
                int idCandidat = res.getInt("idCandidat");
                int idUtilisateur = res.getInt("idUtilisateur");
                String nom = res.getString("nom");
                String prenom = res.getString("prenom");
                String diplomes = res.getString("diplomes");
                String competences = res.getString("competences");
                String situationPro = res.getString("situationPro");
                String motivation = res.getString("motivation");
                String telephone = res.getString("telephone");
                String email = res.getString("email");
                String adresse = res.getString("adresse");
                String typeUtilisateur = res.getString("typeUtilisateur");
                Candidat candidat = new Candidat(idCandidat, idUtilisateur, diplomes, competences, situationPro, motivation,
                        nom, prenom, telephone, email, adresse, typeUtilisateur, "login", "password");
                candidats.add(candidat);
            }
            if (candidats.isEmpty()) {
                throw new DAOCandidatException("Erreur de récupération des candidats : veuillez contacter avec l'administrateur du site");
            }
            res.close();
            stmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return candidats;
    }

    @Override
    public Candidat find(int idCandidat) throws DAOCandidatException {
        String query = "SELECT u.idUtilisateur, u.nom, u.prenom, c.diplomes, c.competences, "
                + "c.situationPro, c.motivation, u.telephone, u.email, u.adresse, u.typeUtilisateur "
                + "FROM utilisateur u,candidat c where "
                + "c.idCandidat = ? and u.idUtilisateur=c.idUtilisateur";
        Candidat candidat = null;
        try {
            Connection conn = daoConnection.getConnection();//Creation de la connexion
            PreparedStatement stmt = conn.prepareStatement(query);
            stmt.setInt(1, idCandidat);
            ResultSet res = stmt.executeQuery(query);
            while (res.next()) {
                int idUtilisateur = res.getInt("idUtilisateur");
                String nom = res.getString("nom");
                String prenom = res.getString("prenom");
                String diplomes = res.getString("diplomes");
                String competences = res.getString("competences");
                String situationPro = res.getString("situationPro");
                String motivation = res.getString("motivation");
                String telephone = res.getString("telephone");
                String email = res.getString("email");
                String adresse = res.getString("adresse");
                String typeUtilisateur = res.getString("typeUtilisateur");
                candidat = new Candidat(idCandidat, idUtilisateur, diplomes, competences, situationPro, motivation,
                        nom, prenom, telephone, email, adresse, typeUtilisateur, "login", "password");
            }
            if (candidat == null) {
                throw new DAOCandidatException("Erreur de récupération du candidat : veuillez contacter avec l'administrateur du site");
            }
            res.close();
            stmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return candidat;
    }

    @Override
    public void create(Candidat candidat) throws DAOCandidatException {
        String query = "INSERT INTO candidat (diplomes, competences, situationPro, motivation) VALUES (?, ?, ?, ?) ";
        Connection connection = daoConnection.getConnection();
        try {
            //Commencer une transaction
            connection.setAutoCommit(false);
            PreparedStatement stmt = connection.prepareStatement(query);
            stmt.setString(1, candidat.getDiplomes());
            stmt.setString(2, candidat.getCompetences());
            stmt.setString(3, candidat.getSituationPro());
            stmt.setString(4, candidat.getMotivation());
            stmt.executeUpdate();
            stmt.close();
            //Récupération de l'identifiant du candidat crée
            Statement maxStmt = connection.createStatement();
            ResultSet rs = maxStmt.executeQuery("SELECT MAX(idCandidat) AS idCandidat FROM candidat");
            if (!rs.next()) {
                int idNewCandidat = rs.getInt("idCandidat");
            } else {
                // Valider
                connection.commit();
            }
            rs.close();
            maxStmt.close();
        } catch (SQLException exc) {
            try {
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            throw new DAOCandidatException("L'insertion n'a pu se faire : contacter l'administrateur du site");
        } finally {
            try {
                connection.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    @Override
    public void update(Candidat candidat) throws DAOCandidatException {
        String query = "UPDATE candidat set diplomes = ?, competences = ?, situationPro = ?, motivation = ? "
                + "where idCandidat = ? ";
        Connection connection = daoConnection.getConnection();
        try {
            //Commencer une transaction
            connection.setAutoCommit(false);
            PreparedStatement stmt = connection.prepareStatement(query);
            stmt.setString(1, candidat.getDiplomes());
            stmt.setString(2, candidat.getCompetences());
            stmt.setString(3, candidat.getSituationPro());
            stmt.setString(4, candidat.getMotivation());

            stmt.executeUpdate();
            stmt.close();
            connection.close();
        } catch (SQLException exc) {
            throw new DAOCandidatException("La mise à jour n'a pu se faire : contacter l'administrateur du site");
        }
    }

    @Override
    public void delete(int idCandidat) throws DAOCandidatException {
        String query = "DELETE FROM candidat where idCandidat = ? ";
        Connection connection = daoConnection.getConnection();
        try {
            //Commencer une transaction
            connection.setAutoCommit(false);
            PreparedStatement stmt = connection.prepareStatement(query);
            stmt.setInt(1, idCandidat);
            stmt.executeUpdate();
            stmt.close();
            connection.close();
        } catch (SQLException exc) {
            throw new DAOCandidatException("La suppression n'a pu se faire : contacter l'administrateur du site");
        }
    }
}
